<?php

namespace action\user;

use \cass\formulaire AS form;

class myprofilAction extends \cass\Action {

    /**
     * Méthode par défaut
     */
    public function init() {
	$this->redirectEven($this->getSession()->isAuthenticated(), 'user', 'connexion');
    }

    /**
     * Méthode de changement de profil
     */
    public function execute() {
	// Infos de la page
	$this->setTitle('Mon profil');

	// Mon profil
	$user = $this->getSession()->getUser();

	// Formulaire de modification
	$formulaire = new form\Formulaire('Modification de profil');
	$formulaire->setButtons('submit', 'Modifier mon profil');
	if ($user->getAvatar() != null) {
	    $formulaire->addToLinks('Supprimer mon avatar', url_for('user', 'myprofil', 'delete-avatar'));
	}
	$formulaire->addToLinks('Changer de mot de passe', url_for('user', 'myprofil', 'pass'));

	$formulaire->append(new form\Input('Identifiant', $user->getName(), true, 'Votre identifiant de connexion'));
	$formulaire->append(new form\Input('Adresse e-mail', $user->getEmail(), true, 'Format mon.adresse@domaine.ntd'));
	$formulaire->append(new form\InputImage('Avatar', $user->getAvatar(), false, 'Préférez une hauteur de 150px et une largeur de 150px'));

	// Vérifications
	if ($formulaire->isPosted()) {
	    // Format de l'adresse e-mail et libre ?
	    if (!$formulaire->{'Adresse e-mail'}->isError()) {
		if (!preg_match(\cass\Data::regex('email'), $formulaire->getValue('Adresse e-mail'))) {
		    $formulaire->{'Adresse e-mail'}->setError('Format attendu : mon.adresse@domaine.ntd');
		} elseif (($formulaire->getValue('Adresse e-mail') != $user->getEmail()) AND
			($this->doctrine->getRepository('User')->findByName($formulaire->getValue('Adresse e-mail')) != null)) {
		    $formulaire->{'Adresse e-mail'}->setError('L\'adresse e-mail indiquée est déjà utilisée');
		}
	    }

	    // Identifiant libre ?
	    if (!$formulaire->{'Identifiant'}->isError() AND
		    ($formulaire->getValue('Identifiant') != $user->getName() ) AND
		    ($this->doctrine->getRepository('User')->findByName($formulaire->getValue('Identifiant')) != null)) {
		$formulaire->{'Identifiant'}->setError('L\'identifiant indiqué est déjà utilisé');
	    }

	    // Avatar ok ?
	    if (!$formulaire->{'Avatar'}->isError() AND !$formulaire->{'Avatar'}->checkMaxSize(150, 150)) {
		$formulaire->{'Avatar'}->setError('La taille  de l\'image ne doit excéder 150x150');
	    }
	}

	// Enregistrements
	if ($formulaire->isPostedWithoutError()) {
	    $user->setName($formulaire->getValue('Identifiant'));
	    $user->setEmail($formulaire->getValue('Adresse e-mail'));
	    if ($formulaire->{'Avatar'}->isProperties()) {
		$path = $formulaire->{'Avatar'}->upload(\cass\Data::directories('upload_avatars'));
		if (($user->getAvatar() != null ) AND file_exists(__PATH__ . $user->getAvatar())) {
		    unlink(__PATH__ . $user->getAvatar());
		}
		$user->setAvatar($path);
	    }
	    $this->doctrine->flush();
	    $formulaire->setConfirm('Votre profil a été mis à jour. Retournez <a href="' . url_for('@homepage') . '">à l\'accueil</a>.');
	}

	// Assignations
	$this->formulaire = $formulaire;
    }

    /**
     * Méthode de l'index
     */
    public function executePass() {
	// Infos de la page
	$this->setTitle('Mon mot de passe');
	$this->addToAriane('Mon profil', url_for('user', 'myprofil'));

	// Mon profil
	$user = $this->getSession()->getUser();

	// Formulaire de modification de mot de passe
	$formulaire = new form\Formulaire('Modification de mot de passe');
	$formulaire->setButtons('submit', 'Modifier mon mot de passe');
	$formulaire->addToLinks('Retour à mon profil', url_for('user', 'myprofil'));
	$formulaire->append(new form\Password('Mot de passe actuel', '', true, 'Nous vérifions vos droits avec le mot de passe courant'));
	$formulaire->append(new form\Password('Nouveau mot de passe', '', true, 'Choisissez un mot de passe personnel et sécurisé'));
	$formulaire->append(new form\Password('Confirmation du nouveau mot de passe', '', true, 'Pour éviter les fautes de frappe'));

	// Vérifications
	if ($formulaire->isPosted()) {
	    // Vérification du mot de passe actuel
	    if (!$formulaire->{'Mot de passe actuel'}->isError() AND (encrypt($formulaire->getValue('Mot de passe actuel'), $user->getSalt()) != $user->getPassword())) {
		$formulaire->{'Mot de passe actuel'}->setError('Votre mot de passe est incorrect');
	    }
	    // Mots de passe identiques
	    if (!$formulaire->{'Nouveau mot de passe'}->isError() AND !$formulaire->{'Confirmation du nouveau mot de passe'}->isError() AND
		    ( $formulaire->getValue('Nouveau mot de passe') != $formulaire->getValue('Confirmation du nouveau mot de passe') )) {
		$formulaire->{'Nouveau mot de passe'}->setError('Le mot de passe et sa confirmation doivent être identiques');
		$formulaire->{'Confirmation du nouveau mot de passe'}->setError('Ce mot de passe est différent du nouveau mot de passe');
	    }
	}

	// Enregistrements
	if ($formulaire->isPostedWithoutError()) {
	    $user->setPassword(encrypt($formulaire->getValue('Nouveau mot de passe'), $user->getSalt()));
	    $this->doctrine->flush();
	    $this->getSession()->saveSession();
	    $formulaire->setConfirm('Votre mot de passe a été mis à jour. Retournez <a href="' . url_for('user', 'myprofil') . '">sur votre profil</a>.');
	}

	// Assignations
	$this->formulaire = $formulaire;
    }

    /**
     * Supprime l'avatar de l'utilisateur
     */
    public function executeDeleteAvatar() {
	// Mon profil et mon avatar
	$user = $this->getSession()->getUser();
	$avatar = $user->getAvatar();

	// Si l'avatar existe, on le supprime
	if (!empty($avatar) AND file_exists(__PATH__ . $avatar)) {
	    unlink(__PATH__ . $avatar);
	}
	// Mise à jour de mon profil
	$user->setAvatar(null);
	$this->doctrine->flush();

	// Redirection vers mon profil
	$this->redirect('user', 'myprofil');
    }

}